// 一定意义上讲，errgroup 是基于 WaitGroup 在错误传递上进行一些优化而提供出来的能力。
// 它不仅可以支持 context.Context 的相关控制能力，还可以将子任务的 error 向上传递。

// 通过一个定长的 sem  chan，来控制启动 goroutine数量。接口 SetLimit来初始化这个chan（只能初始化一次）

// Wait方法：如果有多个子任务返回错误，它只会返回第一个出现的错误，如果所有的子任务都执行成功，就返回 nil。
// WaitGroup 的Wait，阻塞当前 goroutine 直到计数器归零

// errgroup中上下文被取消的情景：
// 当任何一个通过 `Go()` 启动的 goroutine 返回一个非 nil 的错误时，`errgroup` 会立即取消上下文。==》errgroup内部实现的
// 当父上下文（传入 `errgroup.WithContext` 的上下文）被取消时，子上下文也会被取消。  ==》Context的既有机制

package errgrouplearn
